from collections import OrderedDict


def simple_cache(maxsize=128):
    cache = OrderedDict()  # 用于存储缓存结果的字典

    def decorator(func):
        def wrapper(*args, **kwargs):
            # 将参数和关键字参数转换为不可变的哈希值，以便用作缓存键
            key = (args, frozenset(kwargs.items()))

            if key in cache:
                # 如果缓存中已经有结果，直接返回缓存的结果
                return cache[key]
            else:
                # 否则，调用原始函数并缓存结果
                result = func(*args, **kwargs)
                cache[key] = result

                # 如果缓存超过最大大小，淘汰最旧的条目
                if len(cache) > maxsize:
                    cache.popitem(last=False)
                return result

        return wrapper

    return decorator


if __name__ == '__main__':
    # 使用自定义缓存装饰器
    @simple_cache(maxsize=10)
    def expensive_function(x, y):
        print("Calculating...")
        return x ** y

    # 测试
    print(expensive_function(2, 3))  # 计算并返回 8
    print(expensive_function(2, 3))  # 直接从缓存中返回 8，不再计算
